package cz.vse.po1715.piskorky.umela_inteligence;

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import static cz.vse.po1715.piskorky.umela_inteligence.UměláInteligence.ZNAK_PRÁZDNÉ;
import static cz.vse.po1715.piskorky.umela_inteligence.UměláInteligence.PIŠKVORKA;

/*******************************************************************************
 * Instance třídy {@code Políčko} představuje jedno políčko v rámci hracího pole
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
public class Políčko {
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    /** Obsah políčka - nic nebo znak hráče */
    private char obsah = ZNAK_PRÁZDNÉ;
    
    /** Počet piškvorek, které políčkem procházejí */
    private int početProchPiškvorek = 0;
    
    /** Indexy procházejících piškvorek */
    private List<Integer> procházejícíPiškvorky = new ArrayList<Integer>(PIŠKVORKA * 4);
    
    
    /** Váha políčka - [0] je útočná váha pro počítač, [1] obranná; 
     * pro hráče obráceně */
    private int[] váha = new int[2];
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *
     */
    public Políčko() {
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
    
    /*******************************************************************************
    * Nastaví váhu pole podle indexů
    * 
    * @param typ - 0 - útočná počítač, 1 - obranná počítač a obráceně (1 - útočná hráč)
    */
    void setVáha(int typ, int nováVáha) {
        váha[typ] = nováVáha;
    }
    
    /*******************************************************************************
    * Vrátí aktuální váhu pole
    */
    int[] getVáha() {
        return váha;
    }
    
   /*******************************************************************************
    * Vrátí počet piškvorek procházejících polem
    */
    int getPočetProchPiškvorek () {
        return početProchPiškvorek;
    }
    
    /*******************************************************************************
    * Vrátí kolekci indexů procházejících piškvorek
    */
    List<Integer> getProchPiškvorky () {
        return Collections.unmodifiableList(procházejícíPiškvorky);
    }
    
    /*******************************************************************************
    * Vrátí znak obsahu piškvorky
    */
    char getObsah() {
        return obsah;
    }
    
    /*******************************************************************************
    * Vrátí znak obsahu piškvorky
    */
    void setObsah(char obsah) {
        this.obsah = obsah;
    }
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    /*******************************************************************************
    * Přidá na konec seznamu index piškvorky, která polem prochází
    * 
    * @param indexPiškvorky - index procházející piškvorky
    */
    void addIndexPiškvorky(int indexPiškvorky) {
        procházejícíPiškvorky.add(indexPiškvorky);
    }
    
    /*******************************************************************************
    * Zvýší počet procházejících piškvorek o 1
    */
    void zvyšPočetProchPiškvorek() {
        početProchPiškvorek++;
    }
    
    /*******************************************************************************
    * Nastaví váhu pole podle indexů
    * 
    * @param hráč typ - 0 - útočná počítač, 1 - obranná počítač a obráceně (1 - útočná hráč)
    */
    void přičtiVáhu(int hráč, int přírůstek) {
        váha[hráč] += přírůstek;
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Políčko inst = new Políčko();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
